import copy from './copy'
import longpress from './longpress'
import debounce from './debounce'
import lazyload from './lazyload'
import wavesEffect from './waves'

/*
* 钩子函数参数
    指令钩子函数会被传入以下参数：
    el：指令所绑定的元素，可以用来直接操作 DOM。
    binding：一个对象，包含以下 property：
      `v-demo:foo.a.b="message"`
      name：指令名，不包括 v- 前缀。-- "demo"
      value：指令的绑定值，例如：v-my-directive="1 + 1" 中，绑定值为 2。-- 表达式的计算后的值或变量的值
      oldValue：指令绑定的前一个值，仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
      expression：字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中，表达式为 "1 + 1"。
      arg：传给指令的参数，可选。例如 v-my-directive:foo 中，参数为 "foo"。
      modifiers：一个包含修饰符的对象。例如：v-my-directive.foo.bar 中，修饰符对象为 { foo: true, bar: true }。
    vnode：Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
    oldVnode：上一个虚拟节点，仅在 update 和 componentUpdated 钩子中可用。
  Notice: 除了 el 之外，其它参数都应该是只读的，切勿进行修改。如果需要在钩子之间共享数据，建议通过元素的 dataset 来进行。
*/
const directives: { [key: string]: any } = {
  copy,
  longpress,
  debounce,
  lazyload,
  waves: wavesEffect,
}

// [自定义指令](https://juejin.cn/post/6906028995133833230)
export default {
  install(app: any) {
    Object.keys(directives).forEach((key) => {
      app.directive(key, directives[key])
    })
  },
}
